package com.sybil.ot.dominio;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;

@Entity
@Table(name = "SIL_MANTENIMIENTOS")
public class Mantenimiento implements Serializable {

   private static final long serialVersionUID = 1L;
   protected MantenimientoPK llave;
   private String usuarioCreo;
   private String usuarioModif;
   private OrdenTrabajo ordenTrabajo;
   private TipoTrabajo tipoTrabajo;
   private Proveedor proveedor;
   private Equipo equipo;
   private Planta planta;

   public Mantenimiento() {
   }

   public Mantenimiento(MantenimientoPK llave) {
      this.llave = llave;
   }

   public Mantenimiento(String serieOT, int numeroOT, int numeroMtto) {
      this.llave = new MantenimientoPK(serieOT, numeroOT, numeroMtto);
   }

   @EmbeddedId
   public MantenimientoPK getLlave() {
      return llave;
   }

   public void setLlave(MantenimientoPK llave) {
      this.llave = llave;
   }

   @Basic(optional = false)
   @Column(name = "MTTO_USUARIO_CREO")
   public String getUsuarioCreo() {
      return usuarioCreo;
   }

   public void setUsuarioCreo(String usuarioCreo) {
      this.usuarioCreo = usuarioCreo;
   }

   @Column(name = "MTTO_USUARIO_MODIF")
   public String getUsuarioModif() {
      return usuarioModif;
   }

   public void setUsuarioModif(String usuarioModif) {
      this.usuarioModif = usuarioModif;
   }

   @JoinColumns({
      @JoinColumn(name = "MTTO_ORTR_SERIE", referencedColumnName = "ORTR_SERIE", insertable = false, updatable = false),
      @JoinColumn(name = "MTTO_ORTR_NUMERO", referencedColumnName = "ORTR_NUMERO", insertable = false, updatable = false)})
   @ManyToOne(optional = false, fetch = FetchType.LAZY)
   public OrdenTrabajo getOrdenTrabajo() {
      return ordenTrabajo;
   }

   public void setOrdenTrabajo(OrdenTrabajo ordenTrabajo) {
      this.ordenTrabajo = ordenTrabajo;
   }

//   @Valid
   @NotNull(message = "Especificar el Tipo de Trabajo")
   @JoinColumn(name = "MTTO_TIOT_CLAVE", referencedColumnName = "TIOT_CLAVE")
   @ManyToOne(optional = false, fetch = FetchType.LAZY)
   public TipoTrabajo getTipoTrabajo() {
      return tipoTrabajo;
   }

   public void setTipoTrabajo(TipoTrabajo tipoTrabajo) {
      this.tipoTrabajo = tipoTrabajo;
   }

   @Valid
   @NotNull(message = "Especificar el Proveedor de MTTO")
   @JoinColumn(name = "MTTO_PROV_NUMERO", referencedColumnName = "PROV_NUMERO")
   @ManyToOne(optional = false)
   public Proveedor getProveedor() {
      return proveedor;
   }

   public void setProveedor(Proveedor proveedor) {
      this.proveedor = proveedor;
   }

   @JoinColumn(name = "MTTO_EQPO_CLAVE", referencedColumnName = "EQPO_CLAVE")
   @ManyToOne
   public Equipo getEquipo() {
      return equipo;
   }

   public void setEquipo(Equipo equipo) {
      this.equipo = equipo;
   }

   @JoinColumn(name = "MTTO_PLAN_CLAVE", referencedColumnName = "PLAN_CLAVE")
   @ManyToOne
   public Planta getPlanta() {
      return planta;
   }

   public void setPlanta(Planta planta) {
      this.planta = planta;
   }

   @Override
   public int hashCode() {
      int hash = 0;
      hash += (llave != null ? llave.hashCode() : 0);
      return hash;
   }

   @Override
   public boolean equals(Object object) {
      if (!(object instanceof Mantenimiento)) {
         return false;
      }
      Mantenimiento other = (Mantenimiento) object;
      if ((this.llave == null && other.llave != null) || (this.llave != null && !this.llave.equals(other.llave))) {
         return false;
      }
      return true;
   }

   @Override
   public String toString() {
      return "Mantenimiento[ llave=" + llave + " ]";
   }
}
